#ifndef ___fuse_rmdir
#define ___fuse_rmdir 1

#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 28
#endif

#include <stdio.h>
#include <stdlib.h>
#include "mtlib.c"
#include <fuse.h>
#include <fcntl.h>
#include <errno.h>
#include "logging.c"

struct datosBorrarDir {
    char * path;
    char estado;
};

//Prototipos
int fuse_rmdir(const char *);
void ___fuse_procesar_mensaje_rmdir(unsigned char, mti_mensaje, struct datosBorrarDir *);

//BORRAR DIRECTORIO
int fuse_rmdir(const char * path) {

    mti_mensaje datosMensaje;
    int resultado;
    unsigned char centro_rmdir = 0;
    unsigned int descriptorConexion;
    struct datosBorrarDir datos;

        datos.estado = 0;
        datos.path = path;

        while (!centro_rmdir)
            centro_rmdir = mtf_obtener_descriptor(1024);

        descriptorConexion = mtf_conectar(centro_rmdir, MTP_INTERNO, centro_fat);

        if (descriptorConexion == 0) {
            mtf_liberar_descriptor(centro_rmdir);
            return -EAGAIN;
        }

        resultado = mtf_enviar_mensaje(centro_rmdir, descriptorConexion, MTE_ELIMINAR_DIRECTORIO, (char *) datos.path);

        if (resultado == 0) {
            mtf_desconectar(centro_rmdir, descriptorConexion);
            mtf_liberar_descriptor(centro_rmdir);
        return -EAGAIN;
        }

        while (!datos.estado) {

            if (!mtf_recibir_mensajes(centro_rmdir)) continue;

        datosMensaje = mtf_siguiente_mensaje(centro_rmdir);
        ___fuse_procesar_mensaje_rmdir(centro_rmdir, datosMensaje, &datos);
        mtf_descartar_mensaje(centro_rmdir, datosMensaje.codigo);

        }

        mtf_desconectar(centro_rmdir, descriptorConexion); //desconecto la conexion del centro de mensajes
        mtf_liberar_descriptor(centro_rmdir); //libero centro de mensajes con sus datos y conexiones

        switch (datos.estado) {
            case 1:
                return -ENOENT; //el path esta vacio
            case 2:
                return -ENOTDIR; //el path no es un directorio
            default:
                return EXIT_SUCCESS;
        }
}

void ___fuse_procesar_mensaje_rmdir(unsigned char centro_rmdir, mti_mensaje datosMensaje, struct datosBorrarDir * datosBorrar) {

      if (datosMensaje.categoria != MTA_MENSAJE) return;

      switch (datosMensaje.tipo) {

        case MTE_NULL:

          mtf_enviar_mensaje(centro_rmdir, datosMensaje.remitente, MTR_NULL);

        break;

        case MTR_NULL: case MTQ_MENSAJE_NO_VALIDO:

        break;
        //MENSAJES PARA CREAR DIRECTORIO
        case MTR_DIRECTORIO_CREADO:
        {
            char * nombreDirectorio = NULL;

                mtf_obtener_datos(centro_rmdir, datosMensaje.codigo, (char **) &nombreDirectorio);

                log_registrar(descArch, "FUSE", LOG_INFO, "Directorio creado %s \n", nombreDirectorio);
                free(nombreDirectorio);
        }
        break;

        case MTR_DIRECTORIO_NO_CREO:
        {
            char * nombreDirectorio = NULL;
            char motivo;

                mtf_obtener_datos(centro_rmdir, datosMensaje.codigo, (char **) &nombreDirectorio,(char *) &motivo);

                datosBorrar -> estado = motivo;
                log_registrar(descArch, "FUSE", LOG_WARN, "No se pudo crear el directorio %s \n", nombreDirectorio);
                free(nombreDirectorio);
        }
        break;

        default:

              mtf_enviar_mensaje(centro_rmdir, datosMensaje.remitente, MTQ_MENSAJE_NO_VALIDO);

        break;
      }
}

#endif

